package pe.gob.mintra.trabajadoreshogar.action;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

import org.primefaces.component.api.UIData;
import org.primefaces.context.RequestContext;

import pe.gob.mintra.trabajadoreshogar.bean.DatLab;
import pe.gob.mintra.trabajadoreshogar.bean.Empleador;
import pe.gob.mintra.trabajadoreshogar.bean.Liquidacion;
import pe.gob.mintra.trabajadoreshogar.bean.Trabajador;
import pe.gob.mintra.trabajadoreshogar.bean.Usuario;
import pe.gob.mintra.trabajadoreshogar.bean.Vacacion;
import pe.gob.mintra.trabajadoreshogar.service.DatLabService;
import pe.gob.mintra.trabajadoreshogar.service.EmpleadorService;
import pe.gob.mintra.trabajadoreshogar.service.VacacionService;
import pe.gob.mintra.trabajadoreshogar.util.Utilitario;

@ManagedBean(name = "calculoVacacionAction")
@SessionScoped
public class CalculoVacacionAction {

	@ManagedProperty(name = "objDatLab", value = "#{objDatLab}")
	private DatLab objDatLab = null;
	/*
	@ManagedProperty("#{empleadorAction.objEmpleador}")
	private Empleador objEmpleador;
	@ManagedProperty("#{trabajadorAction.objTrabajador}")
	private Trabajador objTrabajador;
	*/
	@ManagedProperty("#{principalAction}")
	private PrincipalAction principalAction;
	@ManagedProperty("#{busquedaAction.objDatLabBusqueda}")
	private DatLab objDatLabBusqueda;
	@ManagedProperty("#{usuarioAction.objUsuario}")
	private Usuario objUsuario;
	
	private List<Vacacion> lstVacacion = null;

	private Utilitario objUtil = new Utilitario();

	private boolean botonDeshabilitado = false;
	private boolean botonDeshabilitadoGenerador = false;
	
	private List<Vacacion> lstVacacionObtenida;
	
	private boolean muestraTablaVista=false;
	
	
		
	public PrincipalAction getPrincipalAction() {
		return principalAction;
	}

	public void setPrincipalAction(PrincipalAction principalAction) {
		this.principalAction = principalAction;
	}

	public Usuario getObjUsuario() {
		return objUsuario;
	}

	public void setObjUsuario(Usuario objUsuario) {
		this.objUsuario = objUsuario;
	}

	public boolean isMuestraTablaVista() {
		return muestraTablaVista;
	}

	public void setMuestraTablaVista(boolean muestraTablaVista) {
		this.muestraTablaVista = muestraTablaVista;
	}

	public List<Vacacion> getLstVacacionObtenida() {
		return lstVacacionObtenida;
	}

	public void setLstVacacionObtenida(List<Vacacion> lstVacacionObtenida) {
		this.lstVacacionObtenida = lstVacacionObtenida;
	}

	public boolean isBotonDeshabilitadoGenerador() {
		return botonDeshabilitadoGenerador;
	}

	public void setBotonDeshabilitadoGenerador(
			boolean botonDeshabilitadoGenerador) {
		this.botonDeshabilitadoGenerador = botonDeshabilitadoGenerador;
	}

	private double montoTotVacacion;

	private double sueldoVacacion;

	private UIData vacacionDataTable;
	
	
	

	public DatLab getObjDatLabBusqueda() {
		return objDatLabBusqueda;
	}

	public void setObjDatLabBusqueda(DatLab objDatLabBusqueda) {
		this.objDatLabBusqueda = objDatLabBusqueda;
	}
	
	/*
	public Empleador getObjEmpleador() {
		return objEmpleador;
	}

	public void setObjEmpleador(Empleador objEmpleador) {
		this.objEmpleador = objEmpleador;
	}

	public Trabajador getObjTrabajador() {
		return objTrabajador;
	}

	public void setObjTrabajador(Trabajador objTrabajador) {
		this.objTrabajador = objTrabajador;
	}
	*/
	
	public double getSueldoVacacion() {
		return sueldoVacacion;
	}

	public void setSueldoVacacion(double sueldoVacacion) {
		this.sueldoVacacion = sueldoVacacion;
	}

	public UIData getVacacionDataTable() {
		return vacacionDataTable;
	}

	public void setVacacionDataTable(UIData vacacionDataTable) {
		this.vacacionDataTable = vacacionDataTable;
	}

	public double getMontoTotVacacion() {
		return montoTotVacacion;
	}

	public void setMontoTotVacacion(double montoTotVacacion) {
		this.montoTotVacacion = montoTotVacacion;
	}

	public boolean isBotonDeshabilitado() {
		return botonDeshabilitado;
	}

	public void setBotonDeshabilitado(boolean botonDeshabilitado) {
		this.botonDeshabilitado = botonDeshabilitado;
	}

	public DatLab getObjDatLab() {
		return objDatLab;
	}

	public void setObjDatLab(DatLab objDatLab) {
		this.objDatLab = objDatLab;
	}

	public List<Vacacion> getLstVacacion() {
		return lstVacacion;
	}

	public void setLstVacacion(List<Vacacion> lstVacacion) {
		this.lstVacacion = lstVacacion;
	}

	public void mostrarVacacion() {
		
		SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");
		java.util.Date fechaInicioComparar=new java.util.Date();
		
		try {
			fechaInicioComparar=sdf.parse("01/05/1957");
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		botonDeshabilitado=false;
		Date fechaActual = new Date();
		
		RequestContext context = RequestContext.getCurrentInstance();
		context.addCallbackParam("esVac", true);
		
		
		if (objDatLab.getD_fecing().getTime() > objDatLab.getD_fecces()
				.getTime()) {
			
			context.addCallbackParam("esValido", false);
			

			FacesMessage msg = new FacesMessage(
					FacesMessage.SEVERITY_ERROR,
					"La fecha de inicio no puede ser mayor que la fecha de cese",
					null);
			FacesContext.getCurrentInstance().addMessage(null, msg);
			
		}
		
		else if (objDatLab.getD_fecces().after(fechaActual)) {

			context.addCallbackParam("esValido", false);

			FacesMessage msg = new FacesMessage(
					FacesMessage.SEVERITY_ERROR,
					"La fecha de cese no puede ser mayor que la fecha actual",
					null);
			FacesContext.getCurrentInstance().addMessage(null, msg);

		} else if(objDatLab.getD_fecing().before(fechaInicioComparar)){
			
			context.addCallbackParam("esValido", false);
			
			FacesMessage msg = new FacesMessage(
					FacesMessage.SEVERITY_ERROR,
					"La fecha de inicio debe ser mayor o igual al 01/05/1957",
					null);
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}		
		
		else{
			context.addCallbackParam("esValido", true);
			generarPeriodosVacacion();
			
			
		
		}
	}
	
	
	private boolean muestraTabla=false;
	
	
	
	public boolean isMuestraTabla() {
		return muestraTabla;
	}

	public void setMuestraTabla(boolean muestraTabla) {
		this.muestraTabla = muestraTabla;
	}
	
	private Empleador objEmpleador = new Empleador();
	private Trabajador objTrabajador = new Trabajador();

	public void generarPeriodosVacacion() {
		
		
		objEmpleador=principalAction.getObjEmpleadorPrin();
		objTrabajador=principalAction.getObjTrabajadorPrin();
		
		
		DatLabService servicioDatLab= new DatLabService();
		EmpleadorService servicioEmpleador=new EmpleadorService();
		VacacionService servicioVacacion= new VacacionService();
		
		lstVacacion = new ArrayList<Vacacion>();
		Liquidacion liq = new Liquidacion();
		liq.setN_cordatlab(objDatLab.getN_cordatlab());
		//liq.setN_cordatlab(principalAction.getObjDatLab().getN_cordatlab());
		lstVacacion=servicioVacacion.obtenerVacacion(liq);
		
		
		int cantAnosUpd=lstVacacion.size()-1;
		int cantAnosRegistroActualUpd=0;
		for(Vacacion v:lstVacacion){
			
			if(v.getN_numano()==1){
				
				cantAnosRegistroActualUpd++;
				if(cantAnosUpd-cantAnosRegistroActualUpd>=1){
					v.setMuestraCheckIdemnizacion(true);
				}else{
					v.setMuestraCheckIdemnizacion(false);
				}
				
			}else{
				v.setMuestraCheckIdemnizacion(false);
			}
			
					
		}
		
		
		
		
		DatLab datLabObtVac= new DatLab();
				
		if(objDatLab.getN_cordatlab()!=-1){
			datLabObtVac=servicioDatLab.obtenerDatLab(liq);
			sueldoVacacion=datLabObtVac.getN_suevac();
		}
		
		System.out.println("NUMERO DE ITEMS DE lstVacacion---> "+lstVacacion.size());
		
		if(lstVacacion.size()==0){
			
			int[] arrDatos = new int[4];
			arrDatos = objUtil.diaMesAno3(objDatLab.getD_fecces(),
					objDatLab.getD_fecing());
			int anos = arrDatos[2];
			int meses = arrDatos[1];
			int dias = arrDatos[0];

			Vacacion objVacacion = null;
			
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			String fecIng = sdf.format(objDatLab.getD_fecing());
			String[] arrFecIng = fecIng.split("/");
			int anoFecIng=Integer.parseInt(arrFecIng[2]);
			int anoFinActual=0;
			
			if (anos > 0) {

				for (int i = 1; i <= anos; i++) {

					objVacacion = new Vacacion();
					objVacacion.setN_numano(1);
					objVacacion.setN_nummes(0);
					objVacacion.setN_numdia(0);
					anoFinActual=(anoFecIng+i);
					objVacacion.setV_desvac(""+(anoFecIng+i-1)+" / "+anoFinActual);
					lstVacacion.add(objVacacion);

				}

				if (meses > 0) {
					objVacacion = new Vacacion();
					objVacacion.setN_numano(0);
					objVacacion.setN_nummes(meses);
					objVacacion.setN_numdia(dias);
					
					objVacacion.setV_desvac(""+anoFinActual+" / "+(anoFinActual+1));
					
					
					lstVacacion.add(objVacacion);
				} else {
					if (dias > 0) {
						objVacacion = new Vacacion();
						objVacacion.setN_numano(0);
						objVacacion.setN_nummes(0);
						objVacacion.setN_numdia(dias);
						
						objVacacion.setV_desvac(""+anoFinActual+" / "+(anoFinActual+1));
						
						lstVacacion.add(objVacacion);
					}

				}

			} else {

				if (meses > 0) {
					objVacacion = new Vacacion();
					objVacacion.setN_numano(0);
					objVacacion.setN_nummes(meses);
					objVacacion.setN_numdia(dias);
					
					objVacacion.setV_desvac(""+anoFecIng+" / "+(anoFecIng+1));
					
					lstVacacion.add(objVacacion);
				} else {
					if (dias > 0) {
						objVacacion = new Vacacion();
						objVacacion.setN_numano(0);
						objVacacion.setN_nummes(0);
						objVacacion.setN_numdia(dias);
						
						objVacacion.setV_desvac(""+anoFecIng+" / "+(anoFecIng+1));
						
						
						lstVacacion.add(objVacacion);
					}
				}

			}
			
			
			montoTotVacacion = 0;

			for (Vacacion oV : lstVacacion) {

				montoTotVacacion += oV.getN_monto();
			}
			
			System.out.println("MONTO TOTAL VACACION--> "+montoTotVacacion);
			
			objDatLab.setN_montotvac(montoTotVacacion);
			objDatLab.setN_suevac(sueldoVacacion);
			
			if(objDatLab.getN_cordatlab()==-1){
				
				
				
				if(objEmpleador.getV_codtdocide().equals("09")){
					System.out.println("INSERTA EMPLEADOR EMPRESA");
					objEmpleador.setN_codsuc(objEmpleador.getObjSucursal().getN_codsuc());
					servicioEmpleador.insertarEmpresa(objEmpleador);
					
					
				}else{
					
					System.out.println("INSERTA EMPLEADOR PERSONA");
					objEmpleador.setN_numcordom(objEmpleador.getObjSucursal().getN_codsuc());
					servicioEmpleador.insertarEmpresaPersona(objEmpleador);
					
				}
				
				objDatLab.setN_coremp(objEmpleador.getN_coremp());
				objDatLab.setV_codtdocide(objTrabajador.getV_codtdocide());
				objDatLab.setV_numdoc(objTrabajador.getV_numdoc());
				objDatLab.setN_numcordom(objTrabajador.getObjSucursalTrab().getN_codsuc());
				
				objDatLab.setV_codusureg(objUsuario.getV_codusu());
				objDatLab.setV_hostreg(objUtil.hostRealizaAccion());
				
				
				servicioDatLab.insertarDatLabVinEmpresa(objDatLab);
				
				
				
			}
			
			for(Vacacion oVacacionInsertar : lstVacacion){
				
				oVacacionInsertar.setN_cordatlab(objDatLab.getN_cordatlab());
				oVacacionInsertar.setV_codusureg(objUsuario.getV_codusu());
				oVacacionInsertar.setV_hostreg(objUtil.hostRealizaAccion());
									
				servicioVacacion.insertarVacacion(oVacacionInsertar);
				
			}
			
			
			liq.setN_cordatlab(objDatLab.getN_cordatlab());
			lstVacacion=servicioVacacion.obtenerVacacion(liq);
			
			int cantAnosIns=lstVacacion.size()-1;
			int cantAnosRegistroActualIns=0;
			for(Vacacion v:lstVacacion){
				
				if(v.getN_numano()==1){
					
					cantAnosRegistroActualIns++;
					if(cantAnosIns-cantAnosRegistroActualIns>=1){
						v.setMuestraCheckIdemnizacion(true);
					}else{
						v.setMuestraCheckIdemnizacion(false);
					}
					
				}else{
					v.setMuestraCheckIdemnizacion(false);
				}
				
				
				
				     
				
			}
			
			
			datLabObtVac=servicioDatLab.obtenerDatLab(liq);
			sueldoVacacion=datLabObtVac.getN_suevac();
			
		}
		
		
		

		
		
		
		
		
		

	}

	private Vacacion objVacacion = null;

	public Vacacion getObjVacacion() {
		return objVacacion;
	}

	public void setObjVacacion(Vacacion objVacacion) {
		this.objVacacion = objVacacion;
	}

	public void muestraMonto() {
		System.out.println("Ano-> " + objVacacion.getN_numano());
	}
	
	
	public void seteaSueldoVacacion(){
		
		System.out.println("SUELDO VAC AHORA --> "+sueldoVacacion);
	}
	
	
	public void calcularTotVacacion() {
		
		VacacionService servicioVacacion = new VacacionService();
		DatLabService servicioDatLab= new DatLabService();
		
		montoTotVacacion = 0;

		for (Vacacion oV : lstVacacion) {

			montoTotVacacion += oV.getN_monto();
		}

			
		objDatLab.setN_montotvac(montoTotVacacion);
		
		System.out.println("SUELDO VACACION---> "+sueldoVacacion);
		
		
		objDatLab.setN_suevac(sueldoVacacion);
		
		objDatLab.setV_codusumod(objUsuario.getV_codusu());
		objDatLab.setV_hostmod(objUtil.hostRealizaAccion());
		
		
		System.out.println("MONTO TOTAL VACACION--> "+objDatLab.getN_montotvac());
		
		servicioDatLab.actualizarDatLab(objDatLab);
		
		for(Vacacion oVacacionAct: lstVacacion){
			
			oVacacionAct.setN_cordatlab(objDatLab.getN_cordatlab());
			
			oVacacionAct.setV_codusumod(objUsuario.getV_codusu());
			oVacacionAct.setV_codusumod(objUtil.hostRealizaAccion());
		
			
			servicioVacacion.actualizarVacacion(oVacacionAct);
		}
		
		botonDeshabilitado=false;
	}

	private Map<Vacacion, Boolean> vacacionSelected = new HashMap<Vacacion, Boolean>() {

		private static final long serialVersionUID = -3360838896781243282L;

		@Override
		public Boolean get(Object object) {

			if (!containsKey(object)) {
				return Boolean.FALSE;
			}
			return super.get(object);
		};

	};

	public Map<Vacacion, Boolean> getVacacionSelected() {
		return vacacionSelected;
	}

	private Map<Vacacion, Boolean> vacacionSelectedIdem = new HashMap<Vacacion, Boolean>() {

		private static final long serialVersionUID = -3360838896781243282L;

		@Override
		public Boolean get(Object object) {

			if (!containsKey(object)) {
				return Boolean.FALSE;
			}
			return super.get(object);
		};

	};

	public Map<Vacacion, Boolean> getVacacionSelectedIdem() {
		return vacacionSelectedIdem;
	}

	public void selectVacacionListener(ValueChangeEvent event) {
		
		System.out.println("SUELDO VACACION--> "+sueldoVacacion);
		
		Vacacion objVacSelec = (Vacacion) vacacionDataTable.getRowData();
		System.out.println("SE SELECCIONO");
		System.out.println(objVacSelec.getN_cordatlab());
		System.out.println(objVacSelec.getN_monto());
		System.out.println(objVacSelec.getN_numano());
		String summary = objVacSelec.isSeleccionaRemuneracion() ? "N" : "S";  
		System.out.println("---> "+summary);
		
		double remCompuMens = sueldoVacacion / 2;
		
		for (Vacacion v : lstVacacion) {
			if (v.equals(objVacSelec)) {
				
				if (summary.equals("S")) {
					double montoAno = remCompuMens * v.getN_numano();
					double montoMes = remCompuMens * v.getN_nummes() / 12;
					double montoDia = remCompuMens * v.getN_numdia() / 360;
					double montoTot= montoAno+montoMes+montoDia;
					v.setN_monto(montoTot);
					v.setV_flgremvac("S");
					
				} else {
					v.setN_monto(0);
					v.setV_flgremvac("N");
					
				}
				
			}	
				
		}
		
		
		
		

	}

	public void montoConIdemnizacion(ValueChangeEvent event) {

		Vacacion objVacSelec = (Vacacion) vacacionDataTable.getRowData();
		String summary = objVacSelec.isSeleccionaImporte() ? "N" : "S";  
		System.out.println("MONTO CON IDEM ---> "+summary);
		for (Vacacion v : lstVacacion) {
			if (v.equals(objVacSelec)) {
				
				if (summary.equals("S")) {
					v.setN_monto(v.getN_monto() * 2);
					v.setV_flgindvac("S");
					
				} else {
					v.setN_monto(v.getN_monto() / 2);
					v.setV_flgindvac("N");
					
				}
				
			

			}
		}

	}
	
	/*
	public void selectVacacionIdemnizacionListener(ValueChangeEvent event) {

		Vacacion objVacSelec = (Vacacion) vacacionDataTable.getRowData();
		double rcm = sueldoVacacion / 2;

		for (Vacacion v : lstVacacion) {
			if (v.equals(objVacSelec)) {
				v.setN_monto(rcm * 2);
			}
		}

	}
	*/
	
	public void nuevoVacacion() {
		botonDeshabilitado = false;
		generarPeriodosVacacion();
		montoTotVacacion = 0;

	}
	
	public void cargarVacacion(){
		muestraTablaVista=true;
		RequestContext context = RequestContext.getCurrentInstance();
		context.addCallbackParam("esVac", true);
		context.addCallbackParam("esValido", true);
		VacacionService servicioVacacion= new VacacionService();
		lstVacacionObtenida = new ArrayList<Vacacion>();
		Liquidacion liq = new Liquidacion();
		liq.setN_cordatlab(objDatLabBusqueda.getN_cordatlab());
		lstVacacionObtenida=servicioVacacion.obtenerVacacion(liq);
	}

}
